﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class TipoMaterial
    {
        public int TipoMaterialId { get; set; }
        public string Descricao { get; set; }
        public bool IsNew { get { return this.TipoMaterialId == 0; } }
        private RzCorportativo.DataAccess.TipoMaterial model;

        public bool Salvar()
        {
            bool @result = false;
            Transaction.Begin((entity) =>
            {
                if (this.IsNew)
                    this.model = this.Insert(entity);
                else
                    this.model = this.Update(entity);
                return true;
            }).OnError((ex) =>
            {
                @result = false;
            }).OnSuccess(() =>
            {
                @result = true;
                this.TipoMaterialId = this.model.TipoMaterialId;
            });
            return @result;
        }

        private RzCorportativo.DataAccess.TipoMaterial Insert(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            entity.AddToTipoMaterial(@item);
            return @item;
        }

        private RzCorportativo.DataAccess.TipoMaterial Update(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            return @item;
        }

        private RzCorportativo.DataAccess.TipoMaterial CreateModel(RZCorporativoEntities entity)
        {
            var tipo = new RzCorportativo.DataAccess.TipoMaterial();
            if (!this.IsNew)
            {
                tipo = entity.TipoMaterial.Where(w => w.TipoMaterialId == this.TipoMaterialId).FirstOrDefault();
                if (tipo == null)
                    throw new Exception("Código inválido");
            }

            tipo.TipoMaterialId = this.TipoMaterialId;
            tipo.Descricao = this.Descricao;
            return tipo;
        }

        internal TipoMaterial CreateTipoMedicamento(RzCorportativo.DataAccess.TipoMaterial item)
        {
            var tipo = new TipoMaterial();
            tipo.TipoMaterialId = item.TipoMaterialId;
            tipo.Descricao = item.Descricao;
            return tipo;
        }

        public static List<Lib.TipoMaterial> Listar(Lib.TipoMaterial tipo)
        {
            if (tipo == null)
                tipo = new TipoMaterial();
            List<Lib.TipoMaterial> tipos = new List<Lib.TipoMaterial>();
            RzCorportativo.DataAccess.RZCorporativoEntities db = new RZCorporativoEntities();
            tipos = db.TipoMaterial.Where(w =>
                    ((tipo.TipoMaterialId == 0) || (tipo.TipoMaterialId == w.TipoMaterialId)) &&
                    ((tipo.Descricao == null || tipo.Descricao == "") || (w.Descricao.Contains(tipo.Descricao)))
                ).ToList().Select(s => tipo.CreateTipoMedicamento(s)).ToList();
            return tipos;
        }
    }
}
